﻿Imports System
Imports System.Text
Imports System.Collections.Generic
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports FrameworkTeste
Imports Spring.Objects.Factory.Xml
Imports Babok
Imports Acesso

<TestClass()> Public Class RequisitosAcessoTeste
    Inherits TesteTransacionalInjecaoDependenciaSpring

#Region " ConfigLocations "

    Protected Overrides ReadOnly Property ConfigLocations() As String()
        Get
            NamespaceParserRegistry.RegisterParser(GetType(Spring.Data.Config.DatabaseNamespaceParser))
            Return New [String]() {"assembly://Teste.Acesso/Teste.Acesso/AutoWired.xml"}
        End Get
    End Property

#End Region

    Private testContextInstance As TestContext
    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    ' <ClassInitialize()> Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
    ' End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    <TestInitialize()> Public Overloads Sub Initialize()
        MyBase.DefaultRollback = False
        MyBase.Initialize()
    End Sub
    '
    ' Use TestCleanup to run code after each test has run
    ' <TestCleanup()> Public Sub MyTestCleanup()
    ' End Sub
    '
#End Region

#Region "Particoes de Equivalencia"

    'EXEMPLO: Public Const Particao_XXX as String = " Select CAMPO_X from TABELA_Y "

#End Region

#Region "Classes Injetadas"

    Private _particaoEquivalencia As ParticaoEquivalencia
    Public Property ParticaoEquivalencia() As ParticaoEquivalencia
        Get
            Throw New NotImplementedException("Nao esqueca de implementar o codigo abaixo")
            '_particaoEquivalencia = New ParticaoEquivalencia("UMA_CONNECTION_NAME")
            Return _particaoEquivalencia
        End Get
        Set(ByVal value As ParticaoEquivalencia)
            _particaoEquivalencia = value
        End Set
    End Property

#End Region

    <TestMethod()> Public Sub Integracao()
        Assert.IsTrue(True)
    End Sub

    <Ignore()> _
    <TestMethod()> Public Sub Start()
        'Dim _requisito As Requisito
        'Dim _verificacao As Verificacao
        'Dim _implementacao As Implementacao
        Dim _itemBackLog As ItemBackLog
        'Dim _itemUI As ItemUI
        'Dim _ui As UI

        _itemBackLog = New ItemBackLog With {.Titulo = "Cadastro de Usuário", _
                                            .EuComo = "Gestor de Segurança do Sistema", _
                                            .Quero = "Cadastrar usuários", _
                                            .Para = "Representar os atores de Sistema"}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            .Add(New Requisito("Um usuário deve implementar a estrutura base de autenticação da Microsoft (IIdentity e IPrincipal)"))
            .Add(New Requisito("Um usuário deve possuir as informações de: Login, Nome, Email, DataDeCriacao, Bloqueado, UltimoAcesso, TentativasDeLogin, Papéis"))
            .Add(New Requisito("Um Usuário pode possuir papéis que o autoriza a realizar operações no sistema"))
            .Add(New Requisito("Um conjunto de papéis autoriza acesso a um conjunto de páginas"))
            .Add(New Requisito("A senha de um usuário NÃO poderá ser especificada na classe usuário"))
            .Add(New Requisito("Um usuário não pode ser excluído do sistema - somente deleção lógica ou desabilitação"))
            .Add(New Requisito("Um Usuário deve poder adicionar papéis novos, ou remover papéis"))
            .Add(New Requisito("Um Usuário para poder trocar a senha, deve inserir a senha antiga"))
            .Add(New Requisito("Se um Usuário esquecer a senha, a opção que terá será de resetar a senha"))
        End With


        _itemBackLog.Salvar()

        '--

        _itemBackLog = New ItemBackLog With {.Titulo = "Cadastro de Papéis", _
                                    .EuComo = "Gestor de Segurança do Sistema", _
                                    .Quero = "Cadastrar Papéis", _
                                    .Para = "Gerenciar as autorizações de operações sobre o sistema, os papéis realizadores de operações e agrupar os usuários do sistema"}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            .Add(New Requisito("Um Papel deve implementar a estrutura base de autenticação da Microsoft (IIdentity e IPrincipal)"))
            .Add(New Requisito("Um Papel deve conter uma descrição genérica do conjunto de operações que permite realizar"))
            .Add(New Requisito("Um Papel deve conter uma data de criação"))
        End With


        _itemBackLog.Salvar()

        '--

        _itemBackLog = New ItemBackLog With {.Titulo = "Autenticação e Autorização", _
                                             .EuComo = "Gestor de Segurança do Sistema", _
                                             .Quero = "Autenticar e Autorizar um usuário", _
                                             .Para = "Garantir o controle de acesso, autencidade, irretratabilidade, disponibilidade e confidencialidade das operações internas ao sistema."}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            .Add(New Requisito("Um Usuário deve implementar a estrutura base de autenticação da Microsoft"))
            .Add(New Requisito("Um Usuário pode possuir papéis que o autoriza a realizar operações no sistema"))
            .Add(New Requisito("Ao fornecer login e senha um Usuário poderá obter do sistema: Bloqueado, SenhaExpirado, Autenticado, NaoAutenticado"))
            .Add(New Requisito("Ao fornecer login e senha um usuário poderá"))
            .Add(New Requisito("Um conjunto de papéis autoriza acesso a um conjunto de páginas"))

        End With


        _itemBackLog.Salvar()

        '--

        Assert.IsTrue(_itemBackLog.Id.HasValue)

    End Sub

    <TestMethod()> _
    Public Sub SalvarUsuario()
        Dim _Usuario As Usuario
        _Usuario = New Usuario With {.Login = "LSANTANA", .Nome = "Leonardo De Santana", _
                                     .Email = "leonardo.conrado.santana@gmail.com"}

        _Usuario.Salvar()

        Assert.IsTrue(_Usuario.Id.HasValue)
    End Sub

    <TestMethod()> _
    Public Sub SalvarPapel()
        Dim _Papel As Papel
        _Papel = New Papel With {.Codigo = "ADMIN", .Habilitado = False}

        _Papel.Salvar()

        Assert.IsTrue(_Papel.Id.HasValue)
    End Sub

    <TestMethod()> _
    Public Sub AssociarPapelAUsuario()
        Dim _Usuario As Usuario
        Dim _Papel As Papel
        _Usuario = New Usuario With {.Login = "TEST-" & Now.Hour & Now.Minute & Now.Second, _
                                     .Nome = "Usuario de Teste de " & Now.ToShortDateString, _
                                     .Email = "TEST-" & Now.Hour & Now.Minute & Now.Second & "@gmail.com"}

        _Papel = New Papel With {.Codigo = "TEST-" & Now.Hour & Now.Minute & Now.Second, _
                                 .Habilitado = False}

        _Usuario.Salvar()
        _Papel.Salvar()

        _Usuario.AdicionarPapel(_Papel)

        Assert.IsTrue(True)
    End Sub

    <TestMethod()> _
Public Sub RemovendoUmPapelAssociado()
        Dim _Usuario As Usuario
        Dim _primeiroPapel As Papel
        Dim _segundoPapel As Papel

        _Usuario = New Usuario With {.Login = "TEST-" & Now.Hour & Now.Minute & Now.Second, _
                                     .Nome = "Usuario de Teste de " & Now.ToShortDateString, _
                                     .Email = "TEST-" & Now.Hour & Now.Minute & Now.Second & "@gmail.com"}

        _primeiroPapel = New Papel With {.Codigo = "TEST-" & Now.Hour & Now.Minute & Now.Second, _
                                 .Habilitado = False}

        _primeiroPapel.Salvar()

        _Usuario.Salvar()

        _segundoPapel = New Papel With {.Codigo = "TEST02-" & Now.Hour & Now.Minute & Now.Second, _
                         .Habilitado = False}

        _segundoPapel.Salvar()

        _Usuario.AdicionarPapel(_primeiroPapel)
        _Usuario.AdicionarPapel(_segundoPapel)

        _Usuario.RemoverPapel(_primeiroPapel)

        Assert.IsTrue(True)
    End Sub

End Class

